<?php
namespace app\common\behavior;

use think\Db;
use think\Exception;
use OSS\OssClient;
use OSS\Core\OssException;

class UploadAfterBehavior
{
    // 钩子入口方法
    public function run($params)
    {
        // $params包含上传后的文件信息，结构如下：
        // [
        //     'id' => 1, // 附件表主键ID
        //     'file' => '/uploads/20241028/xxx.jpg', // 本地文件路径（相对路径）
        //     'name' => 'xxx.jpg', // 文件名
        //     'size' => 10240, // 文件大小
        //     'type' => 'image/jpeg', // 文件类型
        //     ...
        // ]
        
        // 1. 读取OSS配置
        $ossConfig = \think\Config::get('oss');
        if (empty($ossConfig['accessKeyId']) || empty($ossConfig['bucket'])) {
            throw new Exception('阿里云OSS配置未完善');
        }
        
        // 2. 初始化OSS客户端
        try {
            $ossClient = new OssClient(
                $ossConfig['accessKeyId'],
                $ossConfig['accessKeySecret'],
                $ossConfig['endpoint']
            );
        } catch (OssException $e) {
            throw new Exception('OSS客户端初始化失败：' . $e->getMessage());
        }
        
        // 3. 构建本地文件绝对路径和OSS存储路径
        $localFile = ROOT_PATH . 'public' . $params['url']; // 本地文件完整路径
        $ossPath = $ossConfig['prefix'] . ltrim($params['url'], '/'); // OSS路径（如"uploads/20241028/xxx.jpg"）
        
        // 4. 上传文件到OSS
        try {
            $ossClient->uploadFile(
                $ossConfig['bucket'],
                $ossPath,
                $localFile
            );
        } catch (OssException $e) {
            throw new Exception('文件上传到OSS失败：' . $e->getMessage());
        }
        
        // 5. 更新附件表中的文件路径为OSS地址
        $ossUrl = $ossConfig['domain'] . '/' . $ossPath; // 完整的OSS访问URL
        // Db::name('attachment')
        //     ->where('id', $params['id'])
        //     ->update([
        //         'url' => $ossUrl, // 更新URL为OSS地址
        //         'storage' => 'oss' // 标记存储类型为OSS（可选）
        //     ]);
        $params->url = $ossUrl;
        $params->storage = 'oss';
        $params->save();

        
        // 6. 可选：删除本地文件（节省服务器空间）
        // if (file_exists($localFile)) {
        //     @unlink($localFile);
        // }
        
        return true;
    }
}